First Level Cache (Session Cache)

Java Technologies - হাইবারনেট (Hibernate) Hibernate Caching |
181
181

Hibernate এ First-Level Cache (Session Cache) হল একটি session scope এর মধ্যে কাজ করা ক্যাশিং মেকানিজম। এটি Hibernate-এর default cache এবং এটি Hibernate session-এর জন্য স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়। First-level cache Hibernate সেশনের সাথে সম্পর্কিত এবং এটি session object এর মধ্যে ডেটা স্টোর করে রাখে। এটি ডেটাবেস থেকে ডেটা পুনরায় লোড না করে, ক্যাশে থেকে ডেটা সরবরাহ করে, ফলে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি পায়।

First-Level Cache এর বৈশিষ্ট্য:

  1. Session Scope:
    First-level cache শুধুমাত্র Hibernate session এর মধ্যে কার্যকরী। একবার যখন একটি session বন্ধ হয়ে যায়, তখন ক্যাশে পরিষ্কার হয়ে যায়। এতে session এর মধ্যে যে অবজেক্টগুলো লোড হয়, সেগুলো ক্যাশে রাখা হয় এবং পরবর্তী ব্যবহারিত ক্ষেত্রগুলো থেকে ডেটা পাওয়া যায়।
  2. Automatic Caching:
    Hibernate এর first-level cache স্বয়ংক্রিয়ভাবে সক্রিয় থাকে এবং এতে কোন কনফিগারেশন বা সেটআপ করার প্রয়োজন হয় না। যতক্ষণ না সেশনটি শেষ হয়, ততক্ষণ এটি কাজ করে।
  3. No Duplicate Queries:
    First-level cache ক্যাশে থাকা অবজেক্টের জন্য একই কুয়েরি পুনরায় চালানো থেকে বিরত থাকে। যদি একই অবজেক্ট পরবর্তীতে অ্যাক্সেস করা হয়, তবে এটি ডেটাবেস থেকে ফেরত না এসে ক্যাশে থেকে সরবরাহ করা হয়।
  4. Data Retrieval from Cache:
    যখন আপনি get() বা load() মেথডের মাধ্যমে একটি অবজেক্ট রিট্রিভ করেন, Hibernate প্রথমে first-level cache চেক করে এবং অবজেক্টটি ক্যাশে থাকলে তা সরাসরি রিটার্ন করে।

First-Level Cache কাজ করার প্রক্রিয়া

  1. Session Open:
    যখন আপনি Hibernate এর session খুলবেন, তখন হাইবারনেট একটি ক্যাশ তৈরি করে যা শুধুমাত্র ঐ session এর জন্য প্রযোজ্য।
  2. Object Retrieval:
    যখন আপনি একটি entity অবজেক্ট রিট্রিভ করবেন, Hibernate প্রথমে সেই অবজেক্টটি first-level cache এ খুঁজে দেখে। যদি এটি সেখানে পাওয়া যায়, তবে এটি ডেটাবেসে কুয়েরি না করে সরাসরি ক্যাশ থেকে ডেটা ফেরত দেয়।
  3. Object Persistence:
    আপনি যখন একটি অবজেক্ট তৈরি বা আপডেট করবেন, Hibernate সেটি first-level cache এ রাখবে এবং session.commit() হওয়ার পর ডেটাবেসে প্রযোজ্য পরিবর্তনগুলি প্রেরণ করবে।
  4. Session Close:
    একবার session বন্ধ হলে, first-level cache মুছে ফেলা হয়। এর মানে হল যে এই ক্যাশে রাখা ডেটা session এর মধ্যে শেষ হয়, এবং session পুনরায় শুরু হলে নতুন ক্যাশ শুরু হয়।

First-Level Cache এর উদাহরণ

এখানে আমরা একটি উদাহরণ দেখব যেখানে first-level cache ব্যবহৃত হচ্ছে। উদাহরণে, আমরা Employee entity এর একটি instance তৈরি করব এবং প্রথমবার ডেটাবেস থেকে রিট্রিভ করার পর ক্যাশে কীভাবে তা সংরক্ষিত হচ্ছে তা দেখব।

Employee.java (Entity Class)

import javax.persistence.*;

@Entity
@Table(name="employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @Column(name="salary")
    private double salary;

    // Constructors, Getters and Setters
    public Employee() {}

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

Hibernate Session এবং First-Level Cache Example

import org.hibernate.*;
import org.hibernate.cfg.Configuration;

public class FirstLevelCacheExample {
    public static void main(String[] args) {

        // SessionFactory তৈরি করা
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Employee.class)
                .buildSessionFactory();

        // Session তৈরি করা
        Session session = factory.getCurrentSession();

        try {
            // 1st Query - Employee object get করা (First-level cache এর মধ্যে সংরক্ষিত)
            session.beginTransaction();
            Employee employee1 = session.get(Employee.class, 1);  // First query, will hit DB
            System.out.println("Employee Retrieved: " + employee1.getName());

            // 2nd Query - একই Employee object আবার get করা (First-level cache থেকে ফিরে আসবে)
            Employee employee2 = session.get(Employee.class, 1);  // Second query, will use the cache
            System.out.println("Employee Retrieved Again: " + employee2.getName());

            // Check if both references are pointing to the same object in memory
            System.out.println("Are both references the same? " + (employee1 == employee2));

            session.getTransaction().commit();

        } finally {
            factory.close();
        }
    }
}

Output:

Employee Retrieved: John Doe
Employee Retrieved Again: John Doe
Are both references the same? true

এখানে:

  • প্রথমবার employee1 রিট্রিভ করা হলে, Hibernate ডেটাবেস থেকে ডেটা আনে।
  • দ্বিতীয়বার employee2 রিট্রিভ করা হলে, Hibernate ডেটাবেসে কুয়েরি না করে first-level cache থেকে ডেটা ফেরত দেয়।
  • employee1 এবং employee2 একই অবজেক্টের রেফারেন্স, তাই employee1 == employee2 সত্য হয়।

First-Level Cache এর সুবিধা

ফিচারবিবরণ
Performance ImprovementFirst-level cache ডেটাবেসের প্রতি কুয়েরি সংখ্যা কমিয়ে পারফরম্যান্স উন্নত করে।
Avoid Duplicate Queriesএকবার ডেটা লোড হলে, এটি প্রথম সেশনে পুনরায় লোড করা হয় না।
Automatic and TransparentFirst-level cache স্বয়ংক্রিয়ভাবে কার্যকর হয় এবং ডেভেলপারদের কাছে কিছু কনফিগারেশন প্রয়োজন হয় না।
Session-Specific Cacheএটি সেশনের মধ্যে একটি ডেটা পয়েন্টের জন্য নিশ্চিত করে যে ডুপ্লিকেট কুয়েরি না হয়।

First-Level Cache এর চ্যালেঞ্জ

  1. Memory Usage:
    যেহেতু সমস্ত অবজেক্ট সেশন শেষ না হওয়া পর্যন্ত ক্যাশে থাকে, বড় ডেটা সেটে অনেক বেশি মেমরি ব্যবহার হতে পারে।
  2. No Cross-Session Caching:
    First-level cache শুধুমাত্র একটি সেশনের মধ্যে কাজ করে, তাই অন্য সেশনে একই ডেটা রিটার্ন করার জন্য পুনরায় ডেটাবেস কুয়েরি চালাতে হয়।
  3. Caching Beyond Session Scope:
    দীর্ঘ সময় ধরে অবজেক্টগুলো ক্যাশে থাকতে পারে না। যদি আপনি cross-session caching চান তবে Hibernate Second-Level Cache ব্যবহার করা উচিত।

Hibernate এর First-Level Cache (Session Cache) হল একটি শক্তিশালী এবং প্রয়োজনীয় ফিচার যা session scope এর মধ্যে অবজেক্টগুলিকে ক্যাশে রাখে এবং পুনরায় ডেটাবেস কুয়েরি না করে ডেটা সরবরাহ করে। এটি performance বৃদ্ধি করতে সাহায্য করে এবং duplicate queries কমায়। তবে, cross-session ক্যাশিংয়ের জন্য Hibernate-এর Second-Level Cache ব্যবহার করা উচিত।

Content added By
Promotion